package com.sss.common.util;

import com.alibaba.druid.util.Base64;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.apache.commons.io.IOUtils;
import sun.misc.BASE64Encoder;

import java.io.*;

/**
 * @author sss
 * @date 2019-10-28 10:00
 **/
public class TarUtils {

        /**
         * 压缩打包
         * @param sourceFloder 指定打包的源目录
         * @param tarGrzPath 指定目标 tar 包的位置
         * @return void
         * @author SSS
        **/
       public static void compress(String sourceFloder,String tarGrzPath){
           createTarFile(sourceFloder,tarGrzPath);
       }


        private static void createTarFile(String sourceFolder, String tarGzPath){
            TarArchiveOutputStream tarOs=null;
            FileOutputStream fos = null;
            try {
                isExist(tarGzPath);
                // 创建一个 FileOutputStream 到输出文件（.tar.gz）
                fos = new FileOutputStream(tarGzPath);

                // 创建一个 GZIPOutputStream，用来包装 FileOutputStream 对象
                GzipCompressorOutputStream gos = new GzipCompressorOutputStream(new BufferedOutputStream(fos));
                // 创建一个 TarArchiveOutputStream，用来包装 GZIPOutputStream 对象
                tarOs=new TarArchiveOutputStream(gos);
            // 若不设置此模式，当文件名超过 100 个字节时会抛出异常，异常大致如下：
            // is too long ( > 100 bytes)
            // 具体可参考官方文档：http://commons.apache.org/proper/commons-compress/tar.html#Long_File_Names
                tarOs.setLongFileMode(TarArchiveOutputStream.BIGNUMBER_POSIX);
                addFilesToTarGZ(sourceFolder,"",tarOs);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    tarOs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }


        }

    public static void addFilesToTarGZ(String filePath,String parent,TarArchiveOutputStream tarArchiveOutputStream)throws Exception{
        File file = new File(filePath);
        String entryName=parent+file.getName();
        tarArchiveOutputStream.putArchiveEntry(new TarArchiveEntry(file,entryName));
        if (file.isFile()) {
            FileInputStream fileInputStream = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fileInputStream);
            IOUtils.copy(bis,tarArchiveOutputStream);
            tarArchiveOutputStream.closeArchiveEntry();
        }else if (file.isDirectory()){
            // 因为是个文件夹，无需写入内容，关闭即可
            tarArchiveOutputStream.closeArchiveEntry();
            // 读取文件夹下所有文件
            for (File f : file.listFiles()) {
                //递归
                addFilesToTarGZ(f.getAbsolutePath(),entryName+File.separator,tarArchiveOutputStream);
            }
        }
    }

   /**
    * 根据带带文件名的路径创建多级文件夹
    * @param filePath
    * @return boolean
    * @author SSS
   **/
    public static boolean isExist(String filePath) {
        String paths[] = filePath.split("\\\\");
        String dir = paths[0];
        //注意此处循环的长度
        for (int i = 0; i < paths.length - 2; i++) {
            try {
                dir = dir + "/" + paths[i + 1];
                File dirFile = new File(dir);
                if (!dirFile.exists()) {
                    dirFile.mkdir();
                    System.out.println("创建目录为：" + dir);
                }
            } catch (Exception err) {
                System.err.println("文件夹创建发生异常");
            }
        }
        File fp = new File(filePath);
        if (!fp.exists()) {
            // 文件不存在，执行下载功能
            return true;
        } else {
            // 文件存在不做处理
            return false;
        }
    }

    public static void main(String[] args) {
//        compress("E:\\mes-sample","E:\\temp\\test.zip");
//        System.out.println("打包成功");
        //isExist("E:\\temp\\test.zip");
        String s = GetImageStr("E:\\temp\\test.png");
        System.out.println(s);
    }

    /**
     * @Description： 图片转化成base64字符串
     * @param:    path
     * @Return:
     */
    public static String GetImageStr(String path) {
        String dataImage="data:image/png;base64,";
        //将图片文件转化为字节数组字符串，并对其进行Base64编码处理
        //待处理的图片
        String imgFile = path;
        InputStream in = null;
        byte[] data = null;
        //读取图片字节数组
        try
        {
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        //对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        //返回Base64编码过的字节数组字符串
        String encode = encoder.encode(data);
        String url=dataImage+encode;
        return url;
    }
}
